package interfases;

import java.awt.Dimension;
import java.awt.Font;
import java.awt.Toolkit;

import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.border.EmptyBorder;

import com.jgoodies.forms.factories.DefaultComponentFactory;

import controladores.ControladorCategoria;
import controladores.ControladorJuego;
import datas.DataNick;
import datas.DataNombre;

import javax.swing.table.DefaultTableModel;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeModel;
import javax.swing.ListSelectionModel;
import javax.swing.JButton;

import java.awt.Color;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.util.Map;
import java.util.Set;

import javax.swing.JTree;

import java.awt.event.ItemListener;
import java.awt.event.ItemEvent;

import logica.Categoria;
import logica.Juego;

/*********************************************************************************************/

public class IConsultaJuego extends JFrame {

	private static final long serialVersionUID = 6L;

	private JPanel caja;
	private JLabel seleccioneCategoria;
	private JTable tablaCategorias;
	private JScrollPane scrollTablaCategorias;
	private DefaultTableModel datosTablaCategorias;
	private DefaultTableModel datosTablaCompradores;
	private JTextField txtJuego;
	private JTextField txtDescripcion;
	private JTextField txtTamanio;
	private JTextField txtDesarrollador;
	private JTextField datoJuego;
	private JTextField datoDescripcion;
	private JTextField datoTamanio;
	private JTextField datoDesarrollador;
	private JTable tablaCompradores;
	private JComboBox<String> comboJuego;
	private JComboBox<String> comboCategoria;
	private JButton mostrarInfo;
	private JLabel seleccioneJuego;
	private JScrollPane scrollTablaCompradores;
	private JScrollPane scrollTablaComentarios;
	private JTextField tituloComentarios;
	private TreeModel arbolModelo;
	private JTree arbolComentarios;
	private JTextField titulo;
	private JButton salir;
	private DataNombre dataJuego = new DataNombre();
	private boolean puedeAgregar;
	private Juego juego = null;

	/*********************************************************************************************/
	/*********************************************************************************************/
	private void centrarPantalla(JFrame ventana, int x, int y) {
		Toolkit t = Toolkit.getDefaultToolkit();
		Dimension pantalla = t.getScreenSize();
		int height = pantalla.height;
		int width = pantalla.width;
		int px = (int) (width - x) / 2;
		int py = (int) (height - y) / 2;
		ventana.setBounds(px, py, x, y);
	}

	public IConsultaJuego() {
		// CARACTERISTICAS DE LA PANTALLA
		setResizable(false);
		setType(Type.POPUP);
		setTitle("Consulta de Juego");
		centrarPantalla(this, 1100, 640);

		// CARACTERISTICA DE LA CAJA
		caja = new JPanel();
		caja.setBackground(new Color(245, 222, 179));
		caja.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(caja);
		caja.setLayout(null);

		// TITULO DE LA CAJA
		titulo = new JTextField();
		titulo.setEnabled(false);
		titulo.setEditable(false);
		titulo.setBackground(new Color(128, 0, 0));
		titulo.setForeground(new Color(255, 255, 255));
		titulo.setFont(new Font("Eras Medium ITC", Font.BOLD, 20));
		titulo.setHorizontalAlignment(SwingConstants.CENTER);
		titulo.setText("Consulta de Juego");
		titulo.setBounds(0, 0, 1094, 50);
		caja.add(titulo);
		titulo.setColumns(10);

		// SELECCIONE LA CATEGORIA
		seleccioneCategoria = DefaultComponentFactory.getInstance()
				.createLabel("SELECCIONE LA CATEGORIA:");
		seleccioneCategoria
				.setFont(new Font("Eras Medium ITC", Font.PLAIN, 12));
		seleccioneCategoria.setBounds(38, 64, 271, 25);
		caja.add(seleccioneCategoria);

		// INGRESAR EL NICK
		seleccioneJuego = DefaultComponentFactory.getInstance().createLabel("SELECCIONE EL JUEGO:");
		seleccioneJuego.setFont(new Font("Eras Medium ITC", Font.PLAIN, 12));
		seleccioneJuego.setBounds(38, 146, 271, 25);
		caja.add(seleccioneJuego);

		// COMBO DE CATEGORIAS
		comboCategoria = new JComboBox<String>();
		comboCategoria.setFont(new Font("Estrangelo Edessa", Font.PLAIN, 16));
		comboCategoria.setBounds(38, 95, 271, 30);
		caja.add(comboCategoria);

		// COMBO DE JUEGOS
		comboJuego = new JComboBox<String>();
		comboJuego.setFont(new Font("Estrangelo Edessa", Font.PLAIN, 16));
		comboJuego.setEnabled(false);
		comboJuego.setBounds(38, 174, 271, 30);
		caja.add(comboJuego);

		// MOSTRAR INFORMACION
		mostrarInfo = new JButton("Mostrar Informaci\u00F3n");
		mostrarInfo.setEnabled(false);
		mostrarInfo.setFont(new Font("Eras Medium ITC", Font.BOLD, 12));
		mostrarInfo.setBounds(346, 174, 180, 30);
		caja.add(mostrarInfo);

		// TITULO JUEGO
		txtJuego = new JTextField();
		txtJuego.setForeground(new Color(255, 255, 255));
		txtJuego.setFont(new Font("Eras Medium ITC", Font.BOLD, 12));
		txtJuego.setBackground(new Color(210, 105, 30));
		txtJuego.setHorizontalAlignment(SwingConstants.CENTER);
		txtJuego.setText("JUEGO");
		txtJuego.setEditable(false);
		txtJuego.setBounds(38, 242, 130, 20);
		caja.add(txtJuego);
		txtJuego.setColumns(10);

		// TITULO DESCRIPCION
		txtDescripcion = new JTextField();
		txtDescripcion.setForeground(new Color(255, 255, 255));
		txtDescripcion.setFont(new Font("Eras Medium ITC", Font.BOLD, 12));
		txtDescripcion.setBackground(new Color(210, 105, 30));
		txtDescripcion.setText("DESCRIPCION");
		txtDescripcion.setHorizontalAlignment(SwingConstants.CENTER);
		txtDescripcion.setEditable(false);
		txtDescripcion.setBounds(38, 263, 130, 20);
		caja.add(txtDescripcion);
		txtDescripcion.setColumns(10);

		// TITULO PRECIO
		txtTamanio = new JTextField();
		txtTamanio.setForeground(new Color(255, 255, 255));
		txtTamanio.setFont(new Font("Eras Medium ITC", Font.BOLD, 12));
		txtTamanio.setBackground(new Color(210, 105, 30));
		txtTamanio.setHorizontalAlignment(SwingConstants.CENTER);
		txtTamanio.setText("TAMA\u00D1O");
		txtTamanio.setEditable(false);
		txtTamanio.setBounds(38, 284, 130, 20);
		caja.add(txtTamanio);
		txtTamanio.setColumns(10);

		// TITULO NICK
		txtDesarrollador = new JTextField();
		txtDesarrollador.setForeground(new Color(255, 255, 255));
		txtDesarrollador.setFont(new Font("Eras Medium ITC", Font.BOLD, 12));
		txtDesarrollador.setBackground(new Color(210, 105, 30));
		txtDesarrollador.setHorizontalAlignment(SwingConstants.CENTER);
		txtDesarrollador.setText("DESARROLLADOR");
		txtDesarrollador.setEditable(false);
		txtDesarrollador.setBounds(38, 305, 130, 20);
		caja.add(txtDesarrollador);
		txtDesarrollador.setColumns(10);

		// DATOS DEL NOMBRE DEL JUEGO
		datoJuego = new JTextField();
		datoJuego.setBackground(new Color(255, 248, 220));
		datoJuego.setEditable(false);
		datoJuego.setBounds(168, 242, 373, 20);
		caja.add(datoJuego);
		datoJuego.setColumns(10);

		// DATOS DE LA DESCRIPCION DEL JUEGO
		datoDescripcion = new JTextField();
		datoDescripcion.setBackground(new Color(255, 248, 220));
		datoDescripcion.setEditable(false);
		datoDescripcion.setBounds(168, 263, 373, 20);
		caja.add(datoDescripcion);
		datoDescripcion.setColumns(10);

		// DATOS DEL PRECIO DEL JUEGO
		datoTamanio = new JTextField();
		datoTamanio.setBackground(new Color(255, 248, 220));
		datoTamanio.setEditable(false);
		datoTamanio.setBounds(168, 284, 373, 20);
		caja.add(datoTamanio);
		datoTamanio.setColumns(10);

		// DATOS DEL NICK DEL COMPRADOR
		datoDesarrollador = new JTextField();
		datoDesarrollador.setBackground(new Color(255, 248, 220));
		datoDesarrollador.setEditable(false);
		datoDesarrollador.setBounds(168, 305, 373, 20);
		caja.add(datoDesarrollador);
		datoDesarrollador.setColumns(10);

		// DATOS DE LA TABLA DE CATEGORIAS
		datosTablaCategorias = new DefaultTableModel();
		datosTablaCategorias.addColumn("Categorias");
		scrollTablaCategorias = new JScrollPane();
		scrollTablaCategorias.setViewportBorder(new EmptyBorder(1, 1, 1, 1));
		scrollTablaCategorias.setBounds(38, 366, 242, 174);
		caja.add(scrollTablaCategorias);
		tablaCategorias = new JTable();
		tablaCategorias.setFillsViewportHeight(true);
		tablaCategorias.setSurrendersFocusOnKeystroke(true);
		tablaCategorias.setBackground(new Color(255, 250, 205));
		tablaCategorias.setFont(new Font("Estrangelo Edessa", Font.PLAIN, 15));
		tablaCategorias
				.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
		tablaCategorias.setModel(datosTablaCategorias);
		scrollTablaCategorias.setViewportView(tablaCategorias);

		// DATOS DE LA TABLA DE COMPRADORES
		datosTablaCompradores = new DefaultTableModel();
		datosTablaCompradores.addColumn("Compradores");
		scrollTablaCompradores = new JScrollPane();
		scrollTablaCompradores.setViewportBorder(new EmptyBorder(1, 1, 1, 1));
		scrollTablaCompradores.setBounds(299, 367, 242, 174);
		caja.add(scrollTablaCompradores);
		tablaCompradores = new JTable();
		tablaCompradores.setBackground(new Color(255, 250, 205));
		tablaCompradores.setSurrendersFocusOnKeystroke(true);
		tablaCompradores
				.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
		tablaCompradores.setFont(new Font("Estrangelo Edessa", Font.PLAIN, 15));
		tablaCompradores.setFillsViewportHeight(true);
		tablaCompradores.setModel(datosTablaCompradores);
		scrollTablaCompradores.setViewportView(tablaCompradores);

		// TABLA COMENTARIOS
		scrollTablaComentarios = new JScrollPane();
		scrollTablaComentarios.setBounds(584, 134, 479, 406);
		caja.add(scrollTablaComentarios);
		tituloComentarios = new JTextField();
		tituloComentarios.setEditable(false);
		tituloComentarios.setForeground(new Color(255, 255, 255));
		tituloComentarios.setBackground(new Color(210, 105, 30));
		tituloComentarios.setHorizontalAlignment(SwingConstants.CENTER);
		tituloComentarios.setFont(new Font("Eras Medium ITC", Font.BOLD, 15));
		tituloComentarios.setText("Comentarios");
		scrollTablaComentarios.setColumnHeaderView(tituloComentarios);
		tituloComentarios.setColumns(10);

		arbolModelo = new DefaultTreeModel(null, false);
		arbolComentarios = new JTree(arbolModelo);

		scrollTablaComentarios.setViewportView(arbolComentarios);
		/*
		 * arbolComentarios = new JTree();
		 * arbolComentarios.setShowsRootHandles(true);
		 * arbolComentarios.setRootVisible(false);
		 * scrollTablaComentarios.setViewportView(arbolComentarios);
		 */

		// BOTON SALIR
		salir = new JButton("Salir");
		salir.setFont(new Font("Eras Medium ITC", Font.BOLD, 13));
		salir.setBounds(979, 576, 105, 25);
		caja.add(salir);

		/***************************************************************************************************************/
		// CARGAR CATEGORIAS AL COMBOBOX DE CATEGORIAS
		cargarCategorias();

		// ACCION CUANDO SELECCIONA UNA CATEGORIA
		comboCategoria.addItemListener(new ItemListener() {
			public void itemStateChanged(ItemEvent evento) {
				if (evento.getStateChange() == ItemEvent.SELECTED) {
					inicializarDatos();
					mostrarInfo.setEnabled(false);
					if (evento.getItem().equals("CATEGORIAS:")) {
						comboJuego.setEnabled(false);
					} else {
						comboJuego.setEnabled(true);
						// CARGAR LOS JUEGOS DE LA CATEGORIA SELECCIONADA
						cargarJuegos((String) evento.getItem());
					}
				}
			}
		});

		// ACCION CUANDO SELECCIONA UN JUEGO
		comboJuego.addItemListener(new ItemListener() {
			public void itemStateChanged(ItemEvent evento) {
				if (evento.getStateChange() == ItemEvent.SELECTED) {
					inicializarDatos();
					if (evento.getItem().equals("JUEGOS:")) {
						mostrarInfo.setEnabled(false);
					} else {
						mostrarInfo.setEnabled(true);
						dataJuego.setNombre((String) evento.getItem());
					}
				}
			}
		});

		// ACCION DEL BOTON MOSTRAR INFORMACION
		mostrarInfo.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				// ACCION DEL BOTON MOSTRAR INFORMACION
				if (puedeAgregar) {
					mostrarInformacion();
					puedeAgregar = false;
				}
			}
		});

		// ACCION BOTON SALIR
		salir.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				dispose();
			}
		});

	}



/******************************************************************************************************/
/*-----------------------  FUNCIONES EXTRAS Y PRIVADAS  -----------------------------*/

	//INICIALIZO TODOS LOS DATOS A MOSTRAR
	private void inicializarDatos() {
		puedeAgregar = true;

		datoDescripcion.setText("");
		datoJuego.setText("");
		datoDesarrollador.setText("");
		datoTamanio.setText("");

		datosTablaCategorias = new DefaultTableModel();
		datosTablaCategorias.addColumn("Categorias");
		tablaCategorias.setModel(datosTablaCategorias);

		datosTablaCompradores = new DefaultTableModel();
		datosTablaCompradores.addColumn("Compradores");
		tablaCompradores.setModel(datosTablaCompradores);

		arbolModelo = new DefaultTreeModel(null, false);
		arbolComentarios = new JTree(arbolModelo);
		scrollTablaComentarios.setViewportView(arbolComentarios);
	}

	
	//CARGA LAS CATEGORIAS EN EL COMBO DE CATEGORIAS
	private void cargarCategorias() {
		ControladorCategoria cc = new ControladorCategoria();
		Set<Categoria> sdc = cc.getCategorias();
		comboCategoria.addItem("CATEGORIAS:");
		
		for (Categoria dc : sdc) {
			comboCategoria.addItem(dc.getNombre());
		}
	}

	
	//CARGA LOS JUEGOS EN EL COMBO DE JUEGOS
	private void cargarJuegos(String categoria) {
		ControladorJuego cj = new ControladorJuego();
		Set<DataNombre> juegos = cj.getJuegosDeCategoria(categoria);
		comboJuego.removeAllItems();
		comboJuego.addItem("JUEGOS:");
		for (DataNombre juego : juegos) {
			comboJuego.addItem(juego.getNombre());
		}
	}

	
	//MUESTRA TODA LA INFORMACION DEL JUEGO SELECCIONADO
	private void mostrarInformacion() {
		ControladorJuego CJ = new ControladorJuego();
		juego = CJ.getInformacionJuego(dataJuego);
		
		datoDescripcion.setText  ("  " + juego.getDescripcion());
		datoJuego.setText        ("  " + juego.getNombre());
		datoDesarrollador.setText("  " + juego.getDesarrollador());
		datoTamanio.setText      ("  " + String.valueOf(juego.getTamanio())+ " KB");

		for (Categoria dc : juego.getCategorias()) {
			Object[] dato = { dc.getNombre() };
			datosTablaCategorias.addRow(dato);
		}

		for (DataNick dc : juego.getClientes()) {
			Object[] dato = { dc.getNick() };
			datosTablaCompradores.addRow(dato);
		}

		DefaultMutableTreeNode cabeza = new DefaultMutableTreeNode("Comentarios: " + juego.getNombre());
		cargarArbolComentarios(juego.getComentarios(), cabeza);
	
	/***************************************************************/
		arbolModelo = new DefaultTreeModel(cabeza, true);
		arbolComentarios = new JTree(arbolModelo);
		arbolComentarios.setShowsRootHandles(true);
		arbolComentarios.setRootVisible(true);
		scrollTablaComentarios.setViewportView(arbolComentarios);
	}

	
	//CARGA LOS COMENTARIOS EN EL ARBOL DE COMENTARIOS
	@SuppressWarnings({ "rawtypes", "unchecked" })
	private void cargarArbolComentarios(Map<String, Map> comentarios, DefaultMutableTreeNode cabeza){		
		for (String texto : comentarios.keySet()){
			DefaultMutableTreeNode comentario;
			if(comentarios.get(texto).isEmpty()){
				comentario = new DefaultMutableTreeNode(texto, false);
			}
			else{
				comentario = new DefaultMutableTreeNode(texto, true);
				cargarArbolComentarios(comentarios.get(texto), comentario);
			}
			
			cabeza.add(comentario);
		}
	}

}
